package advanced.design_mode.prototypemode;


import java.util.Date;

/***
 * 原型模式:
 *
 * 通过new产生一个对象需要非常繁琐的数据准备或访问权限, 则可以使用原型模式
 * 就是Java种的克隆技术, 一某个对象为原型, 复制出新的对象, 显然, 新的对象具备原型对象的特点
 *
 * 克隆类似于new, 但是不同于new, new创建新的对象属性采用的默认复制, 克隆出的对象的属性值完全和原型对象校内沟通, 并且克隆出的
 * 新对象改变会不影响原型对象, 然后在克隆对象的值
 *
 */
public class Sheep implements Cloneable {
    //要克隆这个类, 必须要实现Cloneable接口, 可以不重写clone()方法


    private String name;
    private Date birthday;

    public Object clone() throws CloneNotSupportedException {
        Object obj = super.clone();//直接调用object对象的clone方法
        //解决: 需要重写sheep的clone方法, 在里边把date属性也克隆, 而不是默认的克隆date对象的引用
        //解开下边两行注释就是深克隆
        /*Sheep sp = (Sheep) obj;
        sp.birthday= (Date) this.birthday.clone();//将属性也克隆 而不是克隆引用*/

        return obj;
    }

    public Sheep() {
    }

    public Sheep(String name, Date birthday) {
        this.name = name;
        this.birthday = birthday;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

/*    @Override
    public String toString() {
        return "Sheep{" +
                "name='" + name + '\'' +
                ", birthday=" + birthday +
                '}';
    }*/
}
